# -*- coding: utf-8 -*-
"""
Created on Mon Feb  4 13:51:39 2019
windows7
python3.6.3
Anaconda3->spyder
opencv3.4.5
代码参考《OpenCV3计算机视觉 Python语言实现》（第二版）
@author: Administrator
"""

import cv2

print(cv2.__version__)                    # 查看opencv的版本

img = cv2.imread('timg.jpg')

#复制原图，避免原图被改变
img2 = img.copy()
img3 = img.copy()

"""
haarcascade_frontalface_default.xml与haarcascade_eye.xml两个文件类似于识别模型，
由于某种原因在本人win7系统下，无法找到相关的文件，
因此需要另外下载这两文件，
将其放在本程序（.py）同一个目录下即可。
"""
#可以用来识别静态的真人的脸和眼睛，基本识别不了动漫人物
'''导入识别人脸的模型'''
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
'''导入识别眼睛的模型'''
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

#scaleFactor的值大于1，但越小被判断为人脸的地方就越多，花的时间就越长
'''提取人脸特征，识别人脸'''
faces = face_cascade.detectMultiScale(gray,1.3,5)
#faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)

print(type(faces),'faces')        # numpy.ndarray
print(faces.size,'faces.size')    # 3*4 =12
print(faces.shape,'faces.shape')  # (3,4)

for (x,y,w,h) in faces:           # 取出faces中的每一列
    #绘制矩形框围住人脸
    img2 = cv2.rectangle(img2,(x,y),(x+w,y+h),(255,0,0),2)
    #print(h.size)
    
    '''在检测到脸部的位置进行眼睛识别'''
    roi_gray = gray[y: y + h, x: x + w]
    roi_color = img2[y: y + h, x: x + w]    
    eyes = eye_cascade.detectMultiScale(roi_gray)
    
    '''在眼睛处绘制识别框'''
    for(ex, ey, ew, eh) in eyes:
        #这是局部处理不能使用 img2 = cv2.rectangle(roi_color,......)
        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) 

cv2.namedWindow('viking detected')
cv2.imshow('viking detected',img2)
cv2.imwrite('viking.jpg',img2)
cv2.waitKey(0)

